import { _decorator } from 'cc';
import { FSMSystem, IState } from './FSMSystem';
import { GameFramework } from './base/GameFramework';

const { ccclass } = _decorator;

/**
 * 流程状态接口
 */
export interface IProcessState extends IState {
    /**
     * 流程初始化
     */
    onProcessInit?(): void;

    /**
     * 流程结束
     */
    onProcessEnd?(): void;
}

/**
 * 基础流程状态类
 */
export abstract class ProcessState implements IProcessState {
    name: string;

    constructor(name: string) {
        this.name = name;
    }

    /**
     * 进入状态时调用
     * @param fromState 来自哪个状态
     * @param data 传递的数据
     */
    onEnter?(fromState: IState | null, data?: any): void {
        console.log(`Entering process state: ${this.name}`);
        this.onProcessInit && this.onProcessInit();
    }

    /**
     * 更新状态时调用
     * @param deltaTime 帧间隔时间
     */
    onUpdate?(deltaTime: number): void {
        // 子类可以重写此方法
    }

    /**
     * 退出状态时调用
     * @param toState 要切换到哪个状态
     * @param data 传递的数据
     */
    onExit?(toState: IState | null, data?: any): void {
        console.log(`Exiting process state: ${this.name}`);
        this.onProcessEnd && this.onProcessEnd();
    }

    /**
     * 流程初始化
     */
    abstract onProcessInit(): void;

    /**
     * 流程结束
     */
    abstract onProcessEnd(): void;
}

/**
 * 流程管理模块
 */
@ccclass('ProcessSystem')
export class ProcessSystem extends FSMSystem {
   

    /**
     * 初始化流程系统
     */
    init(): void {
        super.init();
        console.log("ProcessSystem initialized");
    }

    /**
     * 关闭流程系统
     */
    shutdown(): void {
        super.shutdown();
        console.log("ProcessSystem shutdown");
    }

    /**
     * 添加流程状态
     * @param state 流程状态
     */
    addProcessState(state: IProcessState): void {
        this.addState(state);
    }

    /**
     * 移除流程状态
     * @param stateName 状态名称
     */
    removeProcessState(stateName: string): void {
        this.removeState(stateName);
    }

    /**
     * 启动流程
     * @param initialState 初始状态名称
     */
    startProcess(initialState: string): boolean {
        return this.changeState(initialState);
    }

    /**
     * 结束当前流程
     */
    endProcess(): void {
        // 发送流程结束事件
        GameFramework.event.emit("PROCESS_ENDED");
    }

    /**
     * 暂停流程
     */
    pauseProcess(): void {
        this.stop();
        GameFramework.event.emit("PROCESS_PAUSED");
    }

    /**
     * 恢复流程
     */
    resumeProcess(): void {
        this.start();
        GameFramework.event.emit("PROCESS_RESUMED");
    }
}